import subtitleContentManager from './SubtitleContentManager.js';
import canvasRenderer from './CanvasRenderer.js';
import texturePlaneManager from './TexturePlaneManager.js';

class XRSubtitleSystem {
  constructor() {
    this.isInitialized = false;
    this.immersiveExperience = null;
    this.voiceManager = null;
    this.scene = null;
    this.camera = null;
    this.subtitlePlane = null; // 字幕平面引用
    this.currentSubtitleTimeout = null; // 当前字幕超时定时器
    
    console.log('XRSubtitleSystem initialized');
  }
  
  /**
   * 初始化字幕系统
   * @param {Object} options - 初始化选项
   * @returns {boolean} 初始化是否成功
   */
  initialize(options = {}) {
    try {
      console.log('🔄 XRSubtitleSystem 初始化开始...');
      
      // 保存引用
      this.immersiveExperience = options.immersiveExperience;
      this.voiceManager = options.voiceManager;
      this.scene = options.scene;
      this.camera = options.camera;
      this.audioManager = options.audioManager;
      
      if (!this.texturePlaneManager) {
        // 如果没有显式提供，使用导入的实例
        this.texturePlaneManager = texturePlaneManager;
      }
      
      if (!this.texturePlaneManager) {
        console.error('❌ TexturePlaneManager 未提供');
        return false;
      }
      
      // 设置纹理平面管理器的场景和相机
      if (this.scene && this.camera) {
        this.texturePlaneManager.setSceneAndCamera(this.scene, this.camera);
      }
      
      // 设置Canvas渲染器的Canvas
      const canvas = canvasRenderer.getCanvas();
      this.texturePlaneManager.setCanvas(canvas);
      
      // 建立模块间引用
      subtitleContentManager.setCanvasRenderer(canvasRenderer);
      subtitleContentManager.setTexturePlaneManager(this.texturePlaneManager);
      canvasRenderer.setTexturePlaneManager(this.texturePlaneManager);
      
      // 修复：检查方法是否存在，如果不存在则使用备用方案
      if (typeof this.texturePlaneManager.getPlane === 'function') {
        this.subtitlePlane = this.texturePlaneManager.getPlane();
      } else {
        console.warn('⚠️ getPlane方法不存在，使用备用方案访问plane');
        this.subtitlePlane = this.texturePlaneManager.plane;
      }
      
      if (!this.subtitlePlane) {
        console.error('❌ 无法获取字幕平面');
        
        // 尝试初始化纹理和平面
        if (this.texturePlaneManager._initTextureAndPlane) {
          console.log('🔄 尝试初始化纹理和平面...');
          this.texturePlaneManager._initTextureAndPlane();
          this.subtitlePlane = this.texturePlaneManager.getPlane();
        }
        
        if (!this.subtitlePlane) {
          return false;
        }
      }
      
      // 配置XR字幕平面
      this.configureXRSubtitlePlane();
      
      // 连接到语音管理器
      if (this.voiceManager) {
        subtitleContentManager.connectToVoiceManager(this.voiceManager);
      }
      
      // 连接到音频管理器，实现字幕与音频同步
      if (this.audioManager) {
        console.log('🔊 连接音频管理器，启用字幕与音频同步');
        subtitleContentManager.connectToAudioManager(this.audioManager);
      } else if (window.app && window.app.audioManager) {
        // 尝试从window.app获取音频管理器
        console.log('🔊 从window.app获取音频管理器，启用字幕与音频同步');
        subtitleContentManager.connectToAudioManager(window.app.audioManager);
      }
      
      this.isInitialized = true;
      console.log('✅ XRSubtitleSystem 初始化完成');
      return true;
      
    } catch (error) {
      console.error('❌ XRSubtitleSystem 初始化失败:', error);
      return false;
    }
  }
  
  /**
   * 新增XR字幕平面配置方法
   */
  configureXRSubtitlePlane() {
    if (!this.subtitlePlane) return;
    
    // XR环境特殊配置
    this.subtitlePlane.visible = false; // 初始隐藏
    
    // 确保在XR中正确渲染
    this.subtitlePlane.renderOrder = 999;
    
    if (this.subtitlePlane.material) {
      this.subtitlePlane.material.transparent = true;
      this.subtitlePlane.material.opacity = 0.95;
      this.subtitlePlane.material.depthTest = false;
      this.subtitlePlane.material.depthWrite = false;
    }
    
    // 设置初始位置 - 在摄像机前方
    this.subtitlePlane.position.set(0, -0.3, -0.8);
    
    console.log('✅ XR字幕平面配置完成');
  }
  
  /**
   * 更新字幕系统（在每一帧调用）
   */
  update() {
    if (!this.isInitialized || !this.camera) return;
    
    // 更新字幕平面的位置，使其保持头部锁定
    texturePlaneManager.updatePosition();
  }
  
  /**
   * 显示文本
   * @param {string} text - 要显示的文本
   */
  showText(text) {
    // 检查是否在XR模式下
    if (this.immersiveExperience) {
      const isXRActive = this.immersiveExperience.isXRActive || false;
      const isXRModeActive = typeof this.immersiveExperience.isXRModeActive === 'function' 
        ? this.immersiveExperience.isXRModeActive() 
        : false;
        
      // 只有在XR模式下才显示字幕
      if (!isXRActive && !isXRModeActive) {
        console.log('📱 非XR模式，跳过XR字幕显示:', text);
        return;
      }
    }
    
    console.log('XRSubtitleSystem.showText called with:', text);
    subtitleContentManager.updateContent(text);
    
    // 确保平面可见
    if (this.subtitlePlane) {
      this.subtitlePlane.visible = true;
    }
  }
  
  /**
   * 显示字幕（增强版）
   * @param {string} text - 要显示的文本
   * @param {number} duration - 持续时间（秒）
   * @returns {boolean} 显示是否成功
   */
  showSubtitle(text, duration = 5) {
    // 检查是否在XR模式下
    if (this.immersiveExperience) {
      const isXRActive = this.immersiveExperience.isXRActive || false;
      const isXRModeActive = typeof this.immersiveExperience.isXRModeActive === 'function' 
        ? this.immersiveExperience.isXRModeActive() 
        : false;
        
      // 只有在XR模式下才显示字幕
      if (!isXRActive && !isXRModeActive) {
        console.log('📱 非XR模式，跳过XR字幕显示:', text);
        return false;
      }
    }
    
    console.log('🎬 XRSubtitleSystem.showSubtitle 被调用:', text);
    
    // 检查初始化状态
    if (!this.isInitialized && !this.initialized) {
      console.warn('⚠️ XR字幕系统初始化状态不确定，尝试初始化...');
      // 尝试初始化（如果可能）
      if (this.initialize) {
        this.initialize();
      }
      // 即使初始化失败也继续尝试显示
    }
    
    // 使用主要方法显示文本
    this.showText(text);
    
    // 设置自动隐藏
    this.clearExistingTimeout();
    this.currentSubtitleTimeout = setTimeout(() => {
      this.hideSubtitle();
    }, duration * 1000);
    
    console.log('🎯 XR字幕显示成功:', text);
    return true;
  }
  
  // 注意：完整的hideSubtitle和clearExistingTimeout方法定义在文件后面
  
  /**
   * 增强纹理渲染
   * @param {string} text - 要渲染的文本
   */
  renderTextToTexture(text) {
    console.log('🎨 开始渲染文本到纹理:', text);
    
    // 委托给canvasRenderer处理渲染
    if (canvasRenderer) {
      canvasRenderer.drawText(text);
    }
    
    // 确保纹理更新
    if (texturePlaneManager && texturePlaneManager.texture) {
      texturePlaneManager.texture.needsUpdate = true;
    }
    
    console.log('✅ 纹理渲染完成');
  }
  
  /**
   * 隐藏字幕
   */
  hide() {
    subtitleContentManager.clear();
  }
  
  /**
   * 隐藏字幕（增强版）
   */
  hideSubtitle() {
    console.log('📭 XRSubtitleSystem.hideSubtitle 被调用');
    
    // 隐藏平面
    if (this.subtitlePlane) {
      this.subtitlePlane.visible = false;
    }
    
    // 使用实例变量而不是导入的变量
    if (this.texturePlaneManager && this.texturePlaneManager.updateSubtitle) {
      this.texturePlaneManager.updateSubtitle("");
    }
    
    this.hide(); // 调用原有的hide方法
    this.clearExistingTimeout();
    console.log('✅ XR字幕已隐藏');
  }
  
  /**
   * 清除现有的超时定时器
   */
  clearExistingTimeout() {
    if (this.currentSubtitleTimeout) {
      clearTimeout(this.currentSubtitleTimeout);
      this.currentSubtitleTimeout = null;
    }
  }
  
  /**
   * 设置样式配置
   * @param {Object} styleConfig - 样式配置对象
   */
  setStyle(styleConfig) {
    canvasRenderer.setStyleConfig(styleConfig);
  }
  
  /**
   * 设置字幕位置偏移
   * @param {number} x - X轴偏移
   * @param {number} y - Y轴偏移
   * @param {number} z - Z轴偏移
   */
  setPositionOffset(x, y, z) {
    texturePlaneManager.setPositionOffset(x, y, z);
    console.log('✅ XR字幕位置已调整:', x, y, z);
  }
  
  /**
   * 为XR模式优化字幕位置和渲染
   * 确保字幕在XR空间中正确显示
   */
  positionSubtitlesForXR() {
    console.log('XRSubtitleSystem: 优化XR模式下的字幕位置和渲染');
    
    // 设置适合XR的位置偏移
    this.setPositionOffset(0, -0.3, -0.8); // 调整到视野下方
    
    // 可以在这里添加其他XR特定的优化
    console.log('✅ XR字幕位置和渲染优化完成');
  }
  
  /**
   * 缩放字幕平面
   * @param {number} scale - 缩放因子
   */
  scaleSubtitle(scale) {
    texturePlaneManager.scalePlane(scale);
  }
  
  /**
   * 启用系统
   */
  enable() {
    if (!this.isInitialized) {
      console.warn('Cannot enable XRSubtitleSystem: not initialized');
      return;
    }
    // 可以在这里添加启用逻辑
    console.log('XRSubtitleSystem enabled');
  }
  
  /**
   * 禁用系统
   */
  disable() {
    this.hide();
    console.log('XRSubtitleSystem disabled');
  }
  
  /**
   * 重新配置系统
   * @param {Object} config - 配置选项
   */
  reconfigure(config = {}) {
    if (config.scene && config.camera) {
      this.scene = config.scene;
      this.camera = config.camera;
      texturePlaneManager.setSceneAndCamera(this.scene, this.camera);
    }
    
    // 重新获取字幕平面引用
    this.subtitlePlane = texturePlaneManager.getPlane();
    
    console.log('XRSubtitleSystem reconfigured');
  }
}

// 导出单例实例
const xrSubtitleSystem = new XRSubtitleSystem();
export default xrSubtitleSystem;